import { isObject, isString } from '@/utils/is';

/** 日期时间格式 */
const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';

/** 加入时间戳 */
export function joinTimestamp<T extends boolean>(
  join: boolean,
  restful: T,
): T extends true ? string : object;
/** 加入时间戳 */
export function joinTimestamp(join: boolean, restful = false): string | object {
  if (!join) {
    return restful ? '' : {};
  }
  const now = new Date().getTime();
  if (restful) {
    return `_t=${now}`;
  }
  return { _t: now };
}

/**
 * @description: 格式化请求参数时间 Format request parameter time
 */
export function formatRequestDate(params: Recordable) {
  if (Object.prototype.toString.call(params) !== '[object Object]') {
    return;
  }

  for (const key in params) {
    const format = params[key]?.format ?? null;
    if (format && typeof format === 'function') {
      params[key] = params[key].format(DATE_TIME_FORMAT);
    }
    if (isString(key)) {
      const value = params[key];
      if (value) {
        try {
          params[key] = isString(value) ? value.trim() : value;
        } catch (error: any) {
          throw new Error(error);
        }
      }
    }
    if (isObject(params[key])) {
      formatRequestDate(params[key]);
    }
  }
}

/** 加入查询参数 */
export function joinQuery(url: string, query?: any): string {
  url = url || '';
  let queryStr = '';
  if (!query) {
    return url;
  }
  if (isString(query)) {
    queryStr = query;
  } else {
    for (const key in query) {
      const value = query[key];
      if (Array.isArray(value)) {
        queryStr += `${key}=${encodeURIComponent(value.join(','))}&`;
      } else {
        queryStr += `${key}=${encodeURIComponent(value)}&`;
      }
    }
  }
  queryStr = queryStr.replace(/&$/, ''); // 去除结尾 & 符号
  if (/\?$/.test(url)) {
    url += queryStr; // url 以 ? 结尾，直接添加参数
  } else if (url.includes('?') && !url.endsWith('?')) {
    url = url.replace(/&$/, '') + `&${queryStr}`; // url 包含 ? 但不是以 ? 结尾，去除结尾 & 符号后添加参数
  } else {
    url = url.replace(/\/?$/, '?') + queryStr; // 直接添加 url ? + 参数
  }
  return url;
}

/** 格式化token */
export function formatToken(token: null | string, scheme?: string) {
  scheme = scheme || import.meta.env.VITE_GLOB_API_AUTHENTICATION_SCHEME;
  return token ? (scheme ? `${scheme} ${token}` : token) : null;
}
